package com.kukudexin.annotation;

import java.lang.reflect.Field;

/**
 * @author: dexin
 * @description:
 */
public class CreateEmpTable {

    public static void main(String[] args) {
        String sql = buildSql2();
        System.out.println(sql);
    }

    private static String buildSql() {
        StringBuilder str = new StringBuilder("CREATE TABLE ");
        Class<Emp> claz = Emp.class;
        Table table = claz.getAnnotation(Table.class);
        // (2)获取Table注解的信息,也就是表名信息
        String tableName = table.tableName();
        // (3)把表名信息拼接到SQL语句中
        str.append(tableName + "(");
        Field[] fields = claz.getDeclaredFields();
        for (Field field : fields) {
            if (field.isAnnotationPresent(Column.class)) {
                Column column = field.getAnnotation(Column.class);
                String columnName = column.columnName(); // 获取字段名称信息
                String columnType = column.columnType(); // 获取字段类型信息
                int columnLength = column.columnLength(); // 获取字段长度信息
                String columnConstraint = column.columnConstraint(); // 获取字段约束信息
                if (columnName.equalsIgnoreCase("hiredate")) {
                    str.append(columnName + " " + columnType + " " + columnConstraint + ",");
                } else {
                    str.append(columnName + " " + columnType + "(" + columnLength + ") " + columnConstraint + ",");
                }
            }
        }

        String sql = str.substring(0, str.length() - 1) + ")";
        return sql;
    }

    // 使用反射获取JavaBean类中携带的注解信息,然后根据这些信息自动生成数据库的建表语句
    public static String buildSql2() {
        StringBuilder str = new StringBuilder("CREATE TABLE ");
        Class claz = Emp.class;

        // ====================================================================
        // 1.获取Emp类中的携带的@Table注解,以此来获取表名信息

        // (1)获取Emp类中的携带的@Table注解
        Table table = (Table) claz.getAnnotation(Table.class);

        // (2)获取Table注解的信息,也就是表名信息
        String tableName = table.tableName();

        // (3)把表名信息拼接到SQL语句中
        str.append(tableName + "(");

        // ====================================================================
        // 2.获取Emp类中携带的Column主句,以此在获取字段的相关信息
        // (1)获取Emp类中声明的所有的字段
        // claz.getDeclaredFields()返回 Field 对象的一个数组,包括类中声明的所有的属性,但是没有继承的
        Field[] fields = claz.getDeclaredFields();

        // (2)遍历保存字段的数值,取出每一个字段
        for (Field field : fields) {
            // (3)判断字段上面是否使用了Column注解
            if (field.isAnnotationPresent(Column.class)) {
                // (4)获取字段上面的Column注解
                Column column = field.getAnnotation(Column.class);

                // (5)获取Column注解上面的属性信息,也就是表中字段的信息
                String columnName = column.columnName(); // 获取字段名称信息
                String columnType = column.columnType(); // 获取字段类型信息
                int columnLength = column.columnLength(); // 获取字段长度信息
                String columnConstraint = column.columnConstraint(); // 获取字段约束信息

                // (6)把字段的相关信息拼接到SQL语句中
                if (columnName.equalsIgnoreCase("hiredate")) {
                    str.append(columnName + " " + columnType + " " + columnConstraint + ",");
                } else {
                    str.append(columnName + " " + columnType + "(" + columnLength + ") " + columnConstraint + ",");
                }
            }
        }

        // ====================================================================
        // 3.拼接最终的SQL语句,并且返回
        // (1)去除str中最后的一个逗号,并且关闭")"
        String sql = str.substring(0, str.length() - 1) + ")";
        return sql;
    }
}
